public function add() {
    $goods = M('goods'); //实例化数据库
    if (!empty($_POST)) {
        if (!empty($_FILES)) {
            $config = array(
                'rootPath' => './public/', //文件上传保存的根路径
                'savePath' => 'upload/', //文件上传的保存路径（相对于根路径）
            );
            $upload = new \Think\Upload($config); // 实例化上传类
            $info = $upload->uploadOne($_FILES['goods_img']); //uploadOne是上传单个文件的方法
            if (!$info) { //判断文件是否上传成功
                $this->error($upload->getError()); //没有成功显示上传失败的信息，$upload->getError()显示上传失败信息的方法
            } else {
                //拼装文件路径/文件名
                $imginfo = $info['rootPath'] . $info['savepath'] . $info['savename']; // 上传成功 获取上传文件信息，拼接好的图片可以用这个格式，模板里面用__PUBLIC__带文件路径即可。
                $_POST['goods_big_img'] = $imginfo; //POST的是goods_big_img数据表名，否则create()收集不到数据
                //制作缩略图
                $image = new \Think\Image(); //实例化类库
                $srcimg = $upload->rootPath . $imginfo; //因为__PUBLIC__常量不能在控制器使用，可以换为用upload()方法调用rootPath生成，$upload->rootPath = __PUBLIC__。
                $image->open($srcimg); //打开图片文件
                $smallinfo = $upload->rootPath . $info['rootPath'] . $info['savepath'] . "small_" . $info['savename']; //同理，拼装小图存储的位置和文件名
                $image->thumb(150, 150)->save($smallinfo); //按照原图的比例生成一个最大为150*150的缩略图，并存到指定的路径
                $smallimg = $info['rootPath'] . $info['savepath'] . "small_" . $info['savename']; //因为上面是缩略图存入路径，所以要相对的路径，而存入数据库不能带__PUBLIC__地址，所以在获得POST数据的时候在把 $upload->rootPath路径去掉。
                $_POST['goods_small_img'] = $smallimg; //让数据获取到小图信息，并存到数据库
            }
        }
        $goods->create(); //收集post表单数据
        $str = $goods->add(); //添加数据
        if ($str) {
            $this->success('商品添加成功！', U('showlist'));
        } else {
            $this - error('商品添加失败！', U('add'));
        }
    } else {
        $this->display(); //没有POST显示空模板
    }
}
首先是添加数据，收集表单的create()方法。
模板有POST的自然能收集到，但对于上传的图片，特别是缩略图，是表单里没提交的，所以在控制器里面做了两个POST，否则这两个图片是无法写到数据库里面的。

图片的上传没什么大问题，而且3.2.3里面的PUBLIC还是解决了好多问题的。

但在缩略图上，PUBLIC只能在模板里面用，在控制器里面，这个东东要么做配置文件，要么无解。但还好视频里老师必然也是遇到这个问题，所以用了$upload->rootPath这个方法来实现，因为rootPath这个路径，是在upload()方法里面设置过的。

但是懵逼的问题是

$smallinfo = $upload->rootPath . $info['rootPath'] . $info['savepath'] . "small_" . $info['savename'];
虽然是做达到了正确的存储路径和文件名，但是这样子ADD到数据库里，在读取的时候路径又有问题了，这个路径大概是这样的
./public/upload/2016-01-20/small_569face5c9944.jpg
虽然是有了./public/目录，可以把模板里的PUBLIC去掉输出，但也不行，路径这样就少了项目名称。
好吧，说去了$upload->rootPath这个吧，但存小图的时候，又没有/public/了，路径又NND不对了。

所以作为菜鸟的我，在写一个变量用给POST存数据。

$smallimg = $info['rootPath'] . $info['savepath'] . "small_" . $info['savename'];
好吧，不管怎么说，这样子做倒是解决了问题了，但是代码上就觉得非常奇怪了。

数据添加到是比较简单。

$goods->create(); //收集post表单数据
$str = $goods->add(); //添加数据
实例化数据库后，create收集数据，在add添加数据就可以了